#include "Welcomer.h"
#include "../common/DTOCliente.h"

Welcomer::Welcomer(ColaClientes* clientes,BattleMasterGame* game,ColaMensajeRecibir* colaMensajesServer) {
	this->game = game;
	this->clientes = clientes;
	this->colaMensajesServer = colaMensajesServer;
}

void Welcomer::iniciar(const int puerto,const int maxConexiones){
	this->activo =true;
	this->basePort = puerto;
	socket.listen(puerto, maxConexiones);
}

void Welcomer::terminar(){

	this->activo = false;

	//Cierro el socket de listening
	socket.shutdown();



	colaMensajesServer->terminar();
	this->clientes->terminar();
	colaMensajesServer->signal();



	socket.close();
}


void* Welcomer::run(){
	//Mientras no se cierre el server voy a aceptar todos los clientes
	//y meterlos en mi lista de clientes
	//Mientras no se cierre el server
	while(this->conectado()){
		//Acepto el cliente

		SocketProtocoloPlano* nuevoSocket = socket.accept();
		if((nuevoSocket) && (clientes->getSize() < MAX_SERVER_LISTEN)){
			//Lo meto en la list de clientes
			ConexionServer* cliente= new ConexionServer(nuevoSocket,game,getNextListenPort(),getNextBroadCastPort(),colaMensajesServer);
			this->clientes->setClient(cliente);
			this->clientes->propagarDTO(new DTOCliente(SERVER_OWN,cliente->getClienteId(),CONNECTED,0,0,0));
		}else{
			if(nuevoSocket){
				nuevoSocket->shutdown();
				nuevoSocket->shutdown();
			}
		}


	}

	return NULL;
}
int Welcomer::getNextBroadCastPort(){
	static int broadcastPort= 0;

	broadcastPort--;

	return basePort + broadcastPort;
}

int Welcomer::getNextListenPort(){
	static unsigned int listenPort= 0;

	listenPort++;

	return basePort + listenPort;
}

bool Welcomer::conectado() const{
	return this->activo;
}

Welcomer::~Welcomer(){
}
